/*
 *  BatchVacc.h
 *  BatchVacc
 *
 *  Created by TRAN Thi Cam Giang on 24/11/11.
 *  Copyright 2012 __MyCompanyName__. All rights reserved.
 *
 */

//Initialiser les bibliotheques utilisees
#include <ctime>
#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <map>
#include <stdlib.h>
#include <math.h>
#include "stdio.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <fstream>
#include <sstream>
//#include <sys/stat.h>
//#include <sys/types.h>
//#include <time.h>
#include <stdlib.h>
#include "index.h"
#include "options.h"
#include "evolVac.h"
using namespace std;


/******************************************************************************************************/
//Initialiser les valeurs initiales pour les parametres SIM
vector<double> initialervalParSIM(int, char**);
vector<double> changerValInitParmSIM(vector<double> valInitParmSIM);

//Initialiser les valeurs initiales pour les parametres VAC
vector<double> initialervalParVAC(int, char**);
vector<double> changerValInitParmVAC(vector<double> valInitParmSIM);

//Initialiser les valeurs initiales pour les parametres EVOLVAC
vector<double> initialervalParEVOL(int, char**);
vector<double> changerValInitParmEVOL(vector<double> valInitParmSIM);

/******************************************************************************************************/
// Fonction d'initialisation la table qui contient les nombres de personnes dans chaque groupe
void initialerY_00(int nbVill,int neq, unsigned long **&y, unsigned long S0, unsigned long E0, unsigned long I0,
                                                        unsigned long R0, unsigned long N0);

void initialerY_01(int nbVill,int neq, unsigned long **&y, vector<nodeSEIR>*valeursSEIR0, unsigned long S0, unsigned long E0, unsigned long I0,
                                                        unsigned long R0, unsigned long N0);

/******************************************************************************************************/
// Fonction à calculer les valeurs de Lamda pour chaque ville
void calculerLamda_00(int nbVill, int topology, double beta,
                   double epsilon,unsigned long **y, double *lamda);

/******************************************************************************************************/
//Le but de cette fonction est de calculer les valeurs de Lamda (c'est le taux de transmission S->E) pour chaque ville
void calculerLamda_01(int nbVill, double epsilon, double *beta, double **rho,
                   unsigned long **y, double *lamda);

/******************************************************************************************************/
// Fonction à calculer les fonctions de propensité
void calculerF(int nbVill,double nu,double rmu,
               double sigma, double gamma, double *lamda,
               unsigned long **y,double **f);

/******************************************************************************************************/
// Retourne un nombre pseudo-aléatoire selon une loi normale de paramètres mu et sigma
double creerBetaAleatoire(double beta0, double sigma2);

/******************************************************************************************************/
// Fonction à calculer le taux de contact beta_i qui subit un forcage saisonier, pour la population i.
// beta_i(t) = beta0 *(1+ beta1*cos(2*pi*t + phi_i);
double* calculerBeta_01(int nbVill, double beta0, double beta1, double t, double *phi);

/******************************************************************************************************/
// Fonction à calculer les phases pour chaque la population
double *calculerPhases_01(int nbVill, double phiMAX, double phiMIN);

/******************************************************************************************************/
// Fonction à calculer les valeurs de couplage pour entre deux population i et j
double **calculerTauxCouplage_01(int nbVill, double rho0);

/******************************************************************************************************/
// Fonction à calculer le total des fonctions de propensités
double calculerFsum(int nevent, int nextville,double **f);

/******************************************************************************************************/
// Fonction à faire le événement m
void fairEvenementM(int m, int nextville, unsigned long **y);

/******************************************************************************************************/
// Fonction à calculer le somme fsum de toutes les villes
double calculerFsumToutesVilles(int nbVill, int nevent, double **f);

/******************************************************************************************************/
// Fonction à sauvegarder les resultats dans les fichiers, un fichier par ville
 void writeInFile(string nameFile,int ivill, unsigned long table[100][5000][7],unsigned long indexTable[100]);

/******************************************************************************************************/
// Fonction à afficher les dernieres lignes de resultats de chaque ville
 void afficherDerniereValeur(int nbVill,unsigned long rinitN, double epsilon,
                             double tmax,unsigned long table[100][5000][7],unsigned long indexTabDer[100]);

/******************************************************************************************************/
// Fonction à afficher les arguments de l'appel
void afficherArgument(int nbVill,unsigned long rinitN, double epsilon,
                      double tmax,int argc, char **argv);


/******************************************************************************************************/
// C'est la fonction principale simulerSEIR_00
vector<string> simulerSEIR_00(vector<double> valParSIM, char SAUVER[5],
                           vector<nodeSEIR>*valeursSEIR0,vector<double>*valParVAC,
                           vector<double>*politiqueEVOL);

// C'est la fonction principale simulerSEIR_01
vector<string> simulerSEIR_01(vector<double> valParSIM, char SAUVER[5],
                           vector<nodeSEIR>*valeursSEIR0, double *phi, double **arr_rho);


/******************************************************************************************************/
void verifierEvolVac(vector<double> valParSIM, vector<double> valParVAC,
                     int nbEXPOL,int nbSTRAT,int nbPOL);

/******************************************************************************************************/
//Pour Vaccination
int vaccinerToutesVilles_V1(double tauxVaccToutesVilles,int nbVilles, unsigned long **y,
                            double_vector *politique);

/******************************************************************************************************/
//Pour EvolVac
double eval_policy(vector<double> valParSIM,
                   char SAUVER[5],vector<nodeSEIR>*valeursSEIR0,
                   vector<double>*valParVAC,double_vector* policy);

/******************************************************************************************************/

